home *** CD-ROM | disk | FTP | other *** search
- ε OPTIMIZACION EN ASSEMBLER (I)π
- ε -----------------------------π
-
- En esta serie de artículos trataré de enseñaros cosas sobre optimiza-
- ción de código y pequeños truquillos que harán que vuestro programa en ensam-
- blador gane en velocidad y elegancia.
-
- εOPTIMIZACION EN COMPARACIONESπ
-
- En una instrucción de comparación, hay ciertas cosas que tenemos que
- tener en cuenta.
-
- Tomemos como ejemplo ΓCMP AX, 2121hπ. Esta instrucción simula una resta
- a ΓAXπ de φ2121hπ unidades, modificando las banderas (ya sabéis, si da 0, entonces
- el flag ΩZπ se activa; si no hay rebosamiento, es decir, si ΓAXπ esΘ mayorπ que φ2121hπ
- entonces se activa el flag ΩAπ o el ΩGπ (de ΩGreaterπ), y si φ2121hπ es mayor que ΓAXπ,
- entonces se activa el ΩCπ (ΩCarry Flagπ, que también puede ser tratado como flag
- ΩBπ, de ΩBelowπ).
-
- Si queremos comprobar esto, hay diferentes maneras de hacerlo y que
- hacen lo mismo que ΓCMP XX, YYYYπ. Por ejemplo:
-
- - Si AX no lo vamos a utilizar después, podemos usar la instrucción ΓXORπ para
- la comprobación, puesto que si hacemos ΓXOR AX, 2121hπ, si δAXπ es φ2121hπ éste
- se quedará a 0, activándose el flag Z como en ΓCMPπ, y además ΓXORπ es más rá-
- pido que ΓCMPπ. Claro está que aquí no nos habrá de importar si AX está por
- encima o por debajo en caso de que no sea 0.
-
- - En caso de que AX queramos usarlo después, tendremos que usar ΓCMPπ.
-
- - Si tan sólo quisiéramos mirar si AX es 0, hay varias maneras, y la más len-
- ta (en términos de procesador) es ΓCMP AX, 0π. Hay otras maneras más rápidas,
- en concreto todas las de operaciones a nivel de bits. «ΓOR AX, AXπ»,
- «ΓAND AX, AXπ» y «ΓTEST AX, AXπ» encenderán el flag Z si AX es 0, y no en caso
- contrario, dejando además AX intacto.
-
- Y después están las bifurcaciones. Las banderas sólo serán modificadas
- por operaciones e instrucciones, y nunca "porque sí", por lo que no debemos te-
- mer que se modifiquen si nosotros no hemos puesto nada para ello. Entonces, es-
- to nos permite hacer varios saltos condicionales sin necesidad de volver a com-
- parar. Quiero decir, que no es preciso que antes de un salto condicional vaya
- una instrucción de cambio de banderas, porque estas se conservan. Veamos un
- ejemplo:
-
- Esto sería la manera sin optimizar:
-
- Γ CMP AX, 2121hπ
- Γ JZ Opcion1 π
- Γ CMP AX, 2121hπ
- Γ JB Opcion2 π
- Γ CMP AX, 2121hπ
- Γ JA Opcion3 π
- Γ ... π
-
- Y esto la manera optimizada:
-
- Γ CMP AX, 2121hπ
- Γ JZ Opcion1π
- Γ JA Opcion2π
- Γ JB Opcion3π
-
- La estructuración del código máquina nos permite hacer esto (y encima,
- queda muy elegante).
-
- Después, si os miráis la sección de δTécnicas Víricasπ veréis un montón
- de ejemplos de optimizaciones de código, porque en un virus se practica esto
- hasta la saciedad (aunque más las optimizaciones de tamaño que de velocidad).
-
- Más trucos. Imaginad que queremos saber si δAXπ es el valor φ0FFFFhπ. Más
- rápido que hacer ΓCMP AX, 0FFFFhπ es esto:
-
- Γ INC AXπ
- Γ JZ Opcion1π
-
- No es que sea gran cosa, pero gana en velocidad y vistosidad, y da la
- impresión de que controlamos el tema (y, de hecho, lo controlamos). Si fuera
- comprobar si ΩAX es 1π, pues hacemos ΓDEC AXπ en vez de INC AX.
-
- Bueno, pues en el próximo número más. Empezaremos con optimización de
- código normal, porque espero que en comparaciones hayais captado la idea.
-
-
- ∞ Líyak el Oscuroπ
-
-